/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.AntecedenteHeredoFamiliar;
import desarrollosoft.ghce.entidades.Diagnostico;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.servicio.interfaces.IParserExcepciones;
import desarrollosoft.ghce.servicio.interfaces.IServicioAntecedentes;
import desarrollosoft.ghce.vista.interfaces.Avisable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.Map;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraVentanaDetallesAntecedenteHeredoFamiliar implements Avisable {
    
    @WireVariable("servicioAntecedentes")
    private IServicioAntecedentes servicioAntecedentes;
    
    @WireVariable("parserExcepcionesAntecedentesHeredoFamiliares")
    private IParserExcepciones parserExcepcionesAntecedentesHeredoFamiliares;
    
    private AntecedenteHeredoFamiliar antecedente;
    private Paciente paciente;
    private Estado estado;
    private Avisable avisable;
    
    private AntecedenteHeredoFamiliar antecedenteAnterior;
    
    private boolean camposSoloLectura;
    
    @Init
    public void inicializar() {
        Execution ejecucion = Executions.getCurrent();
        paciente = (Paciente) ejecucion.getArg().get("paciente");
        antecedente = (AntecedenteHeredoFamiliar) ejecucion.getArg().get("antecedenteHeredoFamiliar");
        estado = (Estado) ejecucion.getArg().get("estado");
        avisable = (Avisable) ejecucion.getArg().get("avisable");
        
        switch (estado) {
            case CONSULTANDO:
                camposSoloLectura = true;
                break;
            case CREANDO:
                antecedente = new AntecedenteHeredoFamiliar();
                antecedente.setPaciente(paciente);
                camposSoloLectura = false;
                break;
            case MODIFICANDO:
                antecedenteAnterior = antecedente.clonar();
                camposSoloLectura = false;
                break;
        }
    }
    
    @Command("buscarDiagnostico")
    public void clickBotonBuscarDiagnostico() {
        Map<String, Object> argumentos = new HashMap<>();
        argumentos.put("avisable", this);
        argumentos.put("antecedenteHeredoFamiliar", antecedente);
        Window ventana = (Window) Executions.createComponents("VentanaBusquedaDiagnostico.zul", null, argumentos);
        ventana.doModal();
    }
    
    @Command("guardar")
    public void clickBotonGuardar() {
        switch (estado) {
            case CREANDO:
                try {
                    servicioAntecedentes.crearAntecedenteHeredoFamiliar(antecedente);
                    camposSoloLectura = true;
                    avisable.seCerroVentanaHija(null);
                } catch (Exception ex) {
                    Messagebox.show(parserExcepcionesAntecedentesHeredoFamiliares.parsear(ex.toString()));
                }
                break;
            case MODIFICANDO:
                try {
                    servicioAntecedentes.modificarAntecedenteHeredoFamiliar(antecedente);
                    camposSoloLectura = true;
                    avisable.seCerroVentanaHija(null);
                } catch (Exception ex) {
                    Messagebox.show(parserExcepcionesAntecedentesHeredoFamiliares.parsear(ex.toString()));
                }
                break;
        }
        BindUtils.postNotifyChange(null, null, this, "*");
    }
    
    @Command("cancelar")
    public void clickBotonCancelar() {
        switch (estado) {
            case MODIFICANDO:
                antecedente = antecedenteAnterior;
                camposSoloLectura = true;
                break;
            case CREANDO:
                antecedente = new AntecedenteHeredoFamiliar();
                camposSoloLectura = true;
                break;
        }
        BindUtils.postNotifyChange(null, null, this, "*");
    }
    
    public String getNombreDiagnostico() {
        Diagnostico diagnostico = antecedente.getDiagnostico();
        if (diagnostico == null) {
            return "";
        }
        return diagnostico.getNombre();
    }

    public AntecedenteHeredoFamiliar getAntecedente() {
        return antecedente;
    }

    public boolean getCamposSoloLectura() {
        return camposSoloLectura;
    }

    @Override
    public void seCerroVentanaHija(String nombre) {
        // llamado cuando eligen diagnostico
        BindUtils.postNotifyChange(null, null, this, "*");
    }
    
}
